package bdd;

import beans.Creneau;
import beans.Ec;
import beans.Enseignant;
import beans.Jours;
import beans.Promotion;
import beans.Salle;
import beans.Type;
import beans.Ue;
import java.io.Serializable;
import java.sql.*;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;

public class DBLink {

  private Connection connection;
  private PreparedStatement pst;
  private ResultSet rs;
  private final String IP_SERVEUR = "miage03.dmiage.u-paris10.fr";
  private final String PORT_SERVEUR = "1521";
  private final String NOMBD_SERVEUR = "miage";
  private final String LOGIN_SERVEUR = "m12009";
  private final String MDP_SERVEUR = "m12009pw";

  public DBLink() {
  }

  public DBLink(Connection connection, PreparedStatement pst, ResultSet rs) {
    this.connection = connection;
    this.pst = pst;
    this.rs = rs;
  }

  public Connection getConnection() {
    return connection;
  }

  public void setConnection(Connection connection) {
    this.connection = connection;
  }

  public PreparedStatement getPst() {
    return pst;
  }

  public void setPst(PreparedStatement pst) {
    this.pst = pst;
  }

  public ResultSet getRs() {
    return rs;
  }

  public void setRs(ResultSet rs) {
    this.rs = rs;
  }

  /**
   * Etablit la connexion à la base de données
   */
  public void connexion() {
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
    }
    catch (ClassNotFoundException cnfe) {
      System.out.println("Driver introuvable");
    }

    try {
      connection = DriverManager.getConnection("jdbc:oracle:thin:@//" + IP_SERVEUR + ":" + PORT_SERVEUR + "/" + NOMBD_SERVEUR, LOGIN_SERVEUR, MDP_SERVEUR);
    }
    catch (SQLException se) {
      System.out.println("Base de données introuvable ou erreur dans une requête");
    }
  }

  /**
   * EXEMPLE DE REQUETE SUR UNE TABLE 'logins'
   * Retourne vrai si l'authentification a réussi, faux sinon
   * @param login
   * @param passwd
   * @return un booléen
   */
  public boolean estReconnue(String login, String passwd) {
    boolean estReconnue = false;

    try {
      pst = connection.prepareStatement("SELECT passwd FROM logins WHERE login=?");
      pst.setString(1, login);
      rs = pst.executeQuery();

      while (rs.next()) {
        System.out.println(rs.getString("NOM"));
        if (rs.getString("passwd").equals(passwd)) {
          estReconnue = true;
        }
      }
    }
    catch (SQLException se) {
      System.out.println("Erreur de requête");
    }

    return estReconnue;
  }

  /**
   * EXEMPLE DE REQUETE SUR UNE TABLE 'logins'
   * Retourne vrai si l'autorisation est donnée, faux sinon
   * @param login
   * @return un booléen
   */
  public boolean estAutorisee(String login) {
    boolean estAutorisee = false;

    try {
      pst = connection.prepareStatement("SELECT autorise FROM logins WHERE login=?");
      pst.setString(1, login);
      rs = pst.executeQuery();

      while (rs.next()) {
        if (rs.getInt("passwd") == (1)) {
          estAutorisee = true;
        }
      }
    }
    catch (SQLException se) {
      System.out.println("Erreur de requête");
    }

    return estAutorisee;
  }

  public List<Creneau> listeCreneaux(String dateParam) {
    PreparedStatement pst2;
    ResultSet rs2;

    List<Creneau> creneaux = new ArrayList<Creneau>();

    try {
      if (connection == null) {
        System.out.println("connection = null");
      }
      else {
        System.out.println("connection != null");
      }

      String date = dateParam;
      System.out.println(dateParam);
      String req = "SELECT * FROM creneau where iddate = '";
      req = req+date;
      req = req+ "'";
      System.out.println(req);
      pst = connection.prepareStatement(req);
      //pst.setString(1, login);
      rs = pst.executeQuery();

      while (rs.next()) {
        long numSalle = rs.getLong("numsalle");
        long numEnseignant = rs.getLong("numenseignant");
        long numType = rs.getLong("numtype");
        long numEc = rs.getLong("numec");
        Serializable idDate = (Serializable) rs.getObject("iddate");

        // Récupérations des infos relatives à la salle
        pst2 = connection.prepareStatement("SELECT * FROM salle WHERE numsalle = ?");
        pst2.setString(1, "" + numSalle);
        rs2 = pst2.executeQuery();
        rs2.next();
        Salle salle = new Salle(rs2.getInt("numsalle"), rs2.getShort("capacite"), rs2.getString("lieu"));

        // Récupérations des infos relatives à l'enseignant
        pst2 = connection.prepareStatement("SELECT * FROM enseignant WHERE numenseignant = ?");
        pst2.setString(1, "" + numEnseignant);
        rs2 = pst2.executeQuery();
        rs2.next();
        Enseignant enseignant = new Enseignant(rs2.getInt("numenseignant"),
                null,
                null,
                rs2.getString("nom"),
                rs2.getString("prenom"),
                rs2.getString("adresse"),
                rs2.getLong("telephone"),
                (Date) rs2.getObject("datenaissance"),
                rs2.getString("login"),
                rs2.getString("pwd"));

        // Récupérations des infos relatives au type
        pst2 = connection.prepareStatement("SELECT * FROM type WHERE numtype = ?");
        pst2.setString(1, "" + numType);
        rs2 = pst2.executeQuery();
        rs2.next();
        Type type = new Type(rs2.getInt("numtype"), rs2.getString("libelle"));

        // Récupérations des infos relatives à l'EC
        pst2 = connection.prepareStatement("SELECT * FROM ec WHERE numec = ?");
        pst2.setString(1, "" + numEc);
        rs2 = pst2.executeQuery();
        rs2.next();
        Ec ec = new Ec(rs2.getInt("numec"),new Ue(), rs2.getString("libelle"), rs2.getDouble("coef"));

        // Récupérations des infos relatives au jour
        /*
        System.out.println("Avant recupération jour");
        pst2 = connection.prepareStatement("SELECT * FROM jours WHERE iddate = ?");
        System.out.println("Après recupération jour");
        //pst2.setDate(1,(java.sql.Date) idDate);
        pst2.setTimestamp(1, new Timestamp(Long.parseLong("" + idDate)));
        System.out.println("Après setString");
        rs2 = pst2.executeQuery();
        System.out.println("Après execute");
        rs2.next();
        Jours jours = new Jours((Serializable) rs2.getObject("iddate"));*/
        Jours jours = new Jours();
        creneaux.add(new Creneau(jours, type, enseignant, ec, new Promotion(), salle, rs.getInt("horairedebut"), rs.getInt("horairefin")));
      }
    }
    catch (SQLException se) {
      se.printStackTrace();
      System.out.println("Erreur de requête");
    }

    return creneaux;
  }

  public List<Jours> listeJours() {
    List<Jours> jours = new ArrayList<Jours>();
    try {
      pst = connection.prepareStatement("SELECT * FROM jours");
      //pst.setString(1, login);
      rs = pst.executeQuery();
      while (rs.next()) {
        Jours jour = new Jours(new java.sql.Date(Date.parse(rs.getString("iddate"))));
        jours.add(jour);
      }
    }
    catch (SQLException sqle) {
      sqle.printStackTrace();
    }

    return jours;
  }

  public void deconnexion() {
                try {
            //pst.close();
            connection.close();
        } catch (SQLException ex) {
            System.err.println("Erreur fermeture connexion");
        }

  }
  
  public static void main(String args[]) {
    DBLink bdd = new DBLink();
    bdd.connexion();
    bdd.estReconnue("login", "mdp");	// ne fonctionne que sur une table 'logins' perso
  }
}
